home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / win / c / winet.com / TRACE.C < prev    next >
Encoding:
C/C++ Source or Header  |  1987-04-29  |  3.0 KB  |  128 lines

  1. /*************************************************************************
  2. **                                    **
  3. **     trace                                 **
  4. **                                    **
  5. **  void Trace(char *format, ...)                       **
  6. **                                    **
  7. **  It is not possible to use printf in a Windows library               **
  8. **  because DS != SS. This procedure provides a simple alternative.     **
  9. **                                    **
  10. **  The format string is not quite as for printf. The following escapes **
  11. **  are used:                               **
  12. **                                    **
  13. **      %c    - A character                         **
  14. **    %d    - A decimal number                      **
  15. **    %u    - An unsigned number                    **
  16. **    %s    - A string                          **
  17. **    %b    - A 2 digit hex number                  **
  18. **    %w    - A 4 digit hex number                  **
  19. **    %p    - A far pointer (XXXX:YYYY)                 **
  20. **    No field widths are supported. All output is sent to stdout.    **
  21. **                                    **
  22. ** Written by D. G. Booth    5th February 1987               **
  23. **                                    **
  24. ** Copyright  (C) Richards Computer Products Ltd. 1987          **
  25. **                                    **
  26. *************************************************************************/
  27. #include <stdio.h>
  28. #include <dos.h>
  29. #include "types.h"
  30. #include "trace.h"
  31.  
  32. /* Copy of stdarg.h fudged to work with FAR pointers! */
  33. typedef char far *va_list;
  34.  
  35. #define va_start(ap,v) ap = (va_list)&v + sizeof(v)
  36. #define va_arg(ap,t) ((t far *)(ap += sizeof(t)))[-1]
  37. #define va_end(ap) ap = NULL
  38.  
  39. void trace(LPSTR, ...);
  40. void pascal vTrace(LPSTR, WORD far *);
  41. void OutCh(WORD);
  42.  
  43. /* This routine avoids loading too many C runtime routines: */
  44. #define prch(c) OutCh(c)
  45.  
  46. static char HexString[] = "0123456789abcdef";
  47.  
  48. static void prunsig(u)
  49. register unsigned int u;
  50. {
  51.    if (u > 9) prunsig(u/10);
  52.    prch(u%10 + '0');
  53. }
  54.  
  55. static void prdec(n)
  56. register int n;
  57. {
  58.    if (n < 0)
  59.    {
  60.       prch('-'); n = -n;
  61.    }
  62.    prunsig((unsigned int) n);
  63. }
  64.  
  65. #define prnibl(n) prch (HexString [n & 0x0f])
  66.  
  67. static void prbyte(b)
  68. WORD b;
  69. {
  70.    prnibl (b >> 4); prnibl(b);
  71. }
  72.  
  73. static void prword(w)
  74. WORD w;
  75. {
  76.    prbyte(w >> 8); prbyte(w);
  77. }
  78.  
  79. void trace(s, t)
  80. LPSTR s;
  81. WORD t;
  82. {
  83.    return;
  84.    vTrace ((LPSTR) s, (WORD far *) &t);
  85. }
  86.  
  87. void pascal vTrace (format, args)
  88. LPSTR format;
  89. WORD far *args;
  90. {
  91.    while (*format)
  92.    {
  93.       if (*format == '%') switch(*++format)
  94.       {
  95.       case 'p': /* Far pointer */
  96.      {
  97.         prword (args[1]); prch(':'); prword(args[0]);
  98.         args += 2;
  99.         break;
  100.      }
  101.       case 'c': prch   (*args++); break;
  102.       case 'd': prdec  ((int) *args++);  break;
  103.       case 'u': prunsig(*args++); break;
  104.       case 'b': prbyte (*args++); break;
  105.       case 'w': prword (*args++); break;
  106.       case 's':
  107.         {
  108.            LPSTR t = * ((LPSTR far *) args)++;
  109.            if (t == NULL) vTrace("(null)", NULL);
  110.            else while(*t)
  111.            {
  112.               if (*t == '\n') prch('\r');
  113.               prch(*t++);
  114.            }
  115.            break;
  116.         }
  117.       default:
  118.         prch(*format);
  119.         break;
  120.       } else if (*format == '\n') {
  121.         prch('\r');
  122.         prch('\n');
  123.       } else
  124.         prch(*format);
  125.       format++;
  126.    }
  127. }
  128.